/* Nama File : latar.h                              */
/* Deskripsi : File header dari class Latar         */
/* Anggota Kelompok : Dekha Anggareska 13510050		*/
/*                    Fadhil Muhtadin 13510070		*/
/*                    Muhammad Iqbal 13510064		*/
/*                    Yulius Nainggolan 13510090	*/

#ifndef latar_h
#define latar_h

#include "../../cell/cell/cell.h"
#include "../../bidang/bidang/bidang.h"
#include "../../segitiga/segitiga/segitiga.h"
#include "../../polygon/polygon/polygon.h"
#include "../../segiempat/segiempat/segiempat.h"
#include "../../list/list/listD.h"
#include <iostream>
using namespace std;

class Latar{
	public:
	/* Empat Sekawan */
	Latar();
	/* Konstruktor Latar */
    /* I.S. Latar belum tercipta */
    /* F.S. Latar tercipta */
	Latar(int, int);
	/* Konstruktor Latar dengan parameter */
    /* I.S. Latar belum tercipta */
    /* F.S. Latar tercipta */
	~Latar();
	/* Destruktor Latar */
	/* I.S. Latar terdefinisi */
    /* F.S. Latar dimusnahkan */
	Latar(const Latar&);
	/* CCtor Latar */
    /* I.S. Latar terdefinisi */
    /* F.S. Latar baru tercipta sebagai kopi Bidang sebelumnya */
	Latar& operator=(const Latar&);
	/* operator assignment */
	/* I.S. Latar input terdefinisi */
	/* F.S. Latar output sama dengan Latar input dengan alokasi memori tersendiri */
	
	/* Getter & Setter */
	int getColumn() const;
	/* Mendapatkan kolom dari Latar */
	int getRow() const;
	/* Mendapatkan baris dari Latar */
	void setColumn(int);
	/* Melakukan Set terhadap kolom dari Latar */
	/* I.S. Latar terkonstruksi */
    /* F.S. Data kolom bernilai ci */
	void setRow(int);
	/* Melakukan Set terhadap baris dari Latar */
	/* I.S. Latar terkonstruksi */
    /* F.S. Data baris bernilai ri */
	Bidang* getBidang(int) const;
	/* Mengembalikan pointer to Bidang yang disimpan dalam index i */
	void setBidang(Bidang*);
	/* Menyimpan pointer to Bidang ke dalam List of pointer to Bidang */
	/* I.S. latar terdefinisi dengan List of pointer to Bidang mungkin kosong */
	/* F.S. pointer to Bidang yang disimpan List bertambah satu */
	Cell getCell(int,int) const;
	/* Mengembalikan Cell yang disimpan dalam matriks yang berindex (m,n) */
	void setCell(int,int,char);
	/* Mengubah karakter yang disimpan dalam Cell berindeks (m,n) dengan karakter ci */ 
	
	/* Method lain */
	void DrawLatar();
	/* Menginisialisasi semua cell pada latar dengan Blank */
	/* I.S. Latar terdefinisi */
	/* F.S Tiap cell pada latar berisi karakter blank */
	
	void DrawLatarInvers(char);
	/* Menginisialisasi semua cell pada latar dengan karakter terdefinisi */
	/* I.S. Latar terdefinisi */
	/* F.S Tiap cell pada latar berisi karakter terdefinisi */
	
	void SweepLatar();
	/* Menghapus karakter bidang per baris dan mencetak per frame */
	/* I.S. Semua bidang terisi karakter terdefinisi */
	/* F.S. Semua point pada latar berisi karakter blank dengan pencetakan per frame */
	
	void PrintLatar();
	/* Mencetak latar di layar */
	/* I.S. Latar terdefinisi dan tiap cell sudah berisi suatu karakter */
	/* F.S. Tiap cell pada latar tercetak di layar sesuai koordinat pada matriksnya */
	
	void drawBidang(int, char);
	/* Mengubah semua karakter bidang berindeks k menjadi karakter yang didefinisikan */
	/* I.S. Latar dan bidang terdefinisi */
	/* F.S. Semua sel dalam bidang berindeks k berisi karakter yang didefinisikan */
	
	void drawAllBidang(char);
	/* Mengubah semua karakter dari semua bidang menjadi karakter yang didefinisikan */
	/* I.S. Latar dan bidang terdefinisi */
	/* F.S. Semua sel dalam semua bidang berisi karakter yang didefinisikan */
	
	void drawBidangInvers(int);
	/* Mengubah semua karakter didalam bidang berindeks k menjadi karakter blank */
	/* I.S. Latar dan bidang terdefinisi */
	/* F.S. Semua sel dalam bidang berindeks k berisi karakter blank */
	
	void drawAllBidangInvers();
	/* Mengubah semua karakter didalam semua bidang menjadi karakter blank */
	/* I.S. Latar dan bidang terdefinisi */
	/* F.S. Semua sel dalam semua bidang berisi karakter blank */
	
	void ComputeBN();
	/* Menampilkan perbandingan karakter dalam bidang dengan karakter 'blank' */
	/* I.S. Latar dan Bidang terdefinisi */
	/* F.S. perbandingan karakter dalam bidang dengan karakter 'blank' tampil di layar */
	
	void ComputeBL();
	/* Menampilkan perbandingan karakter dalam bidang dengan semua karakter latar */
	/* I.S. Latar dan Bidang terdefinisi */
	/* F.S. perbandingan karakter dalam bidang dengan semua karakter latar tampil di layar */
	
	private:
	/* Data Member */
	Cell** aCell; // Matriks of Sel
	int column; // Jumlah kolom
	int row; // Jumlah baris
	ListD<Bidang*> B; // List of pointer to Bidang
};
#endif
